package com.xrh.xdemo.service.utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.xrh.core.exceptions.BusinessException;
import com.xrh.xdemo.api.constants.LoginConstants;

import cn.hutool.core.util.StrUtil;


/**
 * @function 登录验证码工具类
 * @author 肖荣辉
 * @date 2023年6月25日
*/
public class LoginValidCodeUtils {

	
	/**
	 * @function 获取请求对象
	 * @author 肖荣辉
	 * @date 2023年6月25日
	*/
	public static HttpServletRequest getReqeust() {
		 return ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
	}
	
	/**
	 * @function 累加登录错误次数
	 * @author 肖荣辉
	 * @date 2023年6月25日
	*/
	public static void addLoginErrorTimes() {
		
		HttpServletRequest request = getReqeust();
		
		HttpSession session = request.getSession();
		
		Object timesObj = session.getAttribute(LoginConstants.LOGIN_ERROR_VALID_CODE_TIMES);
		
		int times = timesObj == null ? 0 : (int) timesObj;
		
		session.setAttribute(LoginConstants.LOGIN_ERROR_VALID_CODE_TIMES ,  ++times);
		
	}
	
	/**
	 * @function 清除登录错误次数
	 * @author 肖荣辉
	 * @date 2023年6月25日
	*/
	public static  void clearLoginErrorTimes() {
		
		HttpServletRequest request = getReqeust();
		
		HttpSession session = request.getSession();
		
		session.removeAttribute(LoginConstants.LOGIN_ERROR_VALID_CODE_TIMES);
		
	}
	
	/**
	 * @function 是否需要展示登录验证码
	 * @author 肖荣辉
	 * @date 2023年6月25日
	*/
	public static  boolean needShowLoginValidCode() {
		return getLoginErrorTimes() >= 3;
	}
	
	/**
	 * @function 获取登录错误次数
	 * @author 肖荣辉
	 * @date 2023年6月25日
	*/
	public static int getLoginErrorTimes() {
		
		HttpServletRequest request = getReqeust();
		
		HttpSession session = request.getSession();
		
		Object timesObj = session.getAttribute(LoginConstants.LOGIN_ERROR_VALID_CODE_TIMES);
		
		int times = timesObj == null ? 0 : (int) timesObj;
		
		return times;
		
	}
	
	/**
	 * @function 设置登录验证码
	 * @param errorValidCode
	 * @author 肖荣辉
	 * @date 2023年6月25日
	*/
	public static void setErrorValidCode(String errorValidCode) {
		
		HttpServletRequest request = getReqeust();
		
		HttpSession session = request.getSession();
		
		session.setAttribute(LoginConstants.LOGIN_ERROR_VALID_CODE , errorValidCode);
		
	}
	
	/**
	 * @function 清除登录错误验证码
	 * @author 肖荣辉
	 * @date 2023年6月25日
	*/
	public static  void clearErrorValidCode() {
		
		HttpServletRequest request = getReqeust();
		
		HttpSession session = request.getSession();
		
		session.removeAttribute(LoginConstants.LOGIN_ERROR_VALID_CODE);
		
	}
	
	/**
	 * @function 清除登录错误验证码和次数
	 * @author 肖荣辉
	 * @date 2023年6月25日
	*/
	public static  void clearErrorValidCodeAndTimes() {
		
		HttpServletRequest request = getReqeust();
		
		HttpSession session = request.getSession();

		session.removeAttribute(LoginConstants.LOGIN_ERROR_VALID_CODE);
		
		session.removeAttribute(LoginConstants.LOGIN_ERROR_VALID_CODE_TIMES);
		
	}
	
	/**
	 * @function 验证登录验证码
	 * @param errorValidCode
	 * @author 肖荣辉
	 * @date 2023年6月25日
	*/
	public static void validErrorValidCode(String errorValidCode) {
		
		//只有需要验证的时候才去验证
		if(!LoginValidCodeUtils.needShowLoginValidCode())
			return;
		
		if(StrUtil.isBlank(errorValidCode))
			throw new BusinessException("验证码不能为空");
		
		HttpServletRequest request = getReqeust();
		
		HttpSession session = request.getSession();
		
		Object obj = session.getAttribute(LoginConstants.LOGIN_ERROR_VALID_CODE);
		
		if(obj == null)
			throw new BusinessException("验证码已经失效");
		
		if(!errorValidCode.equalsIgnoreCase(obj.toString()))
			throw new BusinessException("验证码不正确");
		
	}
	
}
